const {
  createUser,
  getUserInfo,
  updateById,
} = require("../service/user.service");
const jwt = require("jsonwebtoken");
const { JWT_SECRET } = require("../config/config.default");
class UserController {
  // 定义注册的逻辑
  async register(ctx, next) {
    // 1. 获取传过来的数据体
    const { user_name, password } = ctx.request.body;
    // 合法性 -> 先检验传入过来的数据是否为空
    // 合理性 -> 当用户名已经存在的时候就不再继续往下进行，需要重新获取数据
    // 此处需要一个await，因为getUserInfo是一个异步函数，返回的是一个promist，你没有使用await来等待结果，所以永远为true，此处为了防止此种情况，所以添加了await
    // 此处传入的是一个对象 {user_name}
    // 3. 操作数据库 -> 前两都没通过则创建数据表
    const res = await createUser(user_name, password);
    // 当创建成功后返回需要显示的信息，并返回id和用户名
    ctx.body = {
      code: 0,
      message: "用户注册成功",
      result: {
        id: res.id,
        user_name: res.user_name,
      },
    };
  }
  // 此处用async的原因: 如果后续要添加异步操作，无需修改函数定义
  // koa框架推荐中间件使用async，即使暂时没有异步操作
  // 错误处理：async 函数返回Promise 可以用.catch() 或try/catch捕获错误
  async login(ctx, next) {
    const { user_name } = ctx.request.body;
    // 1.获取用户信息
    try {
      const res = await getUserInfo({ user_name });
      ctx.body = {
        code: 0,
        message: "用户登录成功",
        result: {
          // 第一个参数通常包含用户信息的对象
          // 第二个参数是加密的密钥，第三个参数是加密的配置
          // 第三个为jwt的过期时间
          token: jwt.sign(res, JWT_SECRET, { expiresIn: "1d" }),
          // 此处将请求访问回来的信息作为token传给了客户,之后客户端传送回数据的时候需要携带token，而经过中间件的token解析后将所携带的信息返回给服务端
        },
      };
    } catch (err) {
      console.error("用户登录失败", err);
    }
  }
  async changePassword(ctx, next) {
    // 此处的id就是token解析后的数据挂载到了user上得到的
    const id = ctx.state.user.id;
    const password = ctx.request.body.password;
    if (await updateById({ id, password })) {
      ctx.body = {
        code: 0,
        message:'修改密码成功',
        result:''
      } 
    } else {
      ctx.body = {
        code: '10007',
        message:'修改密码失败',
        result:''
      }
    }
    // 3.返回结果
  }
}
module.exports = new UserController();
